package com.to3ks.excelservice.listener;

import cn.hutool.core.date.DateTime;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.to3ks.common.base.utils.IdWorker;

import com.to3ks.excelservice.entity.XlsSwry;
import com.to3ks.excelservice.entity.XlsSwryData;
import com.to3ks.excelservice.service.XlsSwryService;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * @author helen
 * @since 2020/4/18
 */


@Slf4j
public class ExcelDataListener extends AnalysisEventListener  {

    private static final int BATCH_COUNT = 3000;  //最大10万行

    private XlsSwryService xlsSwryService;

    public ExcelDataListener(XlsSwryService xlsSwryService)
    {
        log.info("*****ExcelDataListener已注入*****");
        this.xlsSwryService = xlsSwryService;
    }
    public ExcelDataListener(){}



    List<Object> datas = new ArrayList<>();

    public List<Object> getDatas() {
        return datas;
    }

    public void setDatas(List<Object> datas) {
        this.datas = datas;
    }



    /**
     * 遍历每一行的记录
     * @param object
     * @param context
     */
    public void invoke(Object object, AnalysisContext context) {

        if (datas.isEmpty()||datas.size() <BATCH_COUNT) {
            //log.info("list中数据小于{},因此继续往list中添加记录",BATCH_COUNT);
            addRecord((XlsSwryData) object);
        }
        if(datas.size() >= BATCH_COUNT){
            //TODO 存储数据库的操作
            log.info("一次读取的数据已经达到最大存储数{}，系统正在将数据存储到数据库中,请稍候...",datas.size());
            xlsSwryService.sqlBatchInsert(datas);
            datas.clear();
            log.info("本次数据已存储数据库，并清理内存");
        }
    }

    /**
     * 增加一条记录到list
     * @param  data
     */
    public void addRecord(XlsSwryData data){
        //log.info("解析到第{}条记录: {}",datas.size(),data);
        XlsSwry xlsSwry = new XlsSwry();
        xlsSwry.setSwryDm(data.getSwryDm());
        xlsSwry.setSwryxm(data.getSwryxm());
        xlsSwry.setSfzjhm(data.getSfzjhm());
        xlsSwry.setLxdh(data.getLxdh());
        xlsSwry.setJrswjsj(data.getJrswjsj());
        xlsSwry.setYxbz(data.getYxbz());
        xlsSwry.setDeleted(0);

        xlsSwry.setId(Long.toString(new IdWorker().nextId())); //雪花算法实现全局唯一 Id
        xlsSwry.setGmtCreate(new DateTime());
        xlsSwry.setGmtModified(new DateTime());
        datas.add(xlsSwry);
    }


    /**
     * 所有数据读取之后的收尾工作
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        if (datas !=null) {  //最后一一次了
            //TODO 存储数据库的操作
            log.info("最后一次了{}，系统正在将数据存储到数据库中,请稍候...",datas.size());
            xlsSwryService.sqlBatchInsert(datas);
            datas.clear();
            log.info("所有数据已存储数据库，并清理内存");
        }

        log.info("*********全部数据解析并导入数据库完成，系统正切换到页面********");
    }




}
